#include "../include/kasm.h"
#include "../include/defs.h"
#include "../include/kc.h"
#include "../include/video.h"

char *vidmem = (char*)0xB8000;
char aux_buf[80];
int ult_pro =3;
int posicion=4;


/**************************************************************************/
void
escribir_pantalla(Tparametros parametros, int offset)
{
	int i,j,k;
	int aux = -1;
	int pant = SCREEN_MEMORY;
	offset=0;
	int es_enter = 0;
	int es_backspace = 0;

	if(*(parametros.buffer) == '\n')
	{
		es_enter = 1;
		parametros.buffer++;
	}
	if(posicion <= ult_pro)
	{
		posicion = ult_pro+1;
	}

	if(parametros.longit == -1)
	{
		es_backspace = 1;
		*(vidmem+posicion)=' ';
		*(vidmem+posicion+1)=WHITE_TXT;
		if(posicion-2 < ult_pro)
		{
			;
		}
		else
		{
			*(vidmem+posicion-1)=WHITE_TXT;
			*(vidmem+posicion-2)=' ';
			posicion-=2;
			if(posicion < 0)
			{	
				posicion = 0;
			}
		}
	}	

	else
	{
		for(i=0; i<parametros.longit; i++)
		{
			
			*(vidmem+posicion+offset+i)=*(parametros.buffer++);
			offset++;
			*(vidmem+posicion+offset+i)=WHITE_TXT;
			if((vidmem+posicion+offset+i) == (char *)(0xB8FA0-1))
			/*hacer scroll*/
			{
				ult_pro -=160;
				char * vidaux = vidmem + 160;	
				for(j=pant+160,k=0;j<0xB8Fa0;j++,k++)
				{
					vidmem[k] = vidaux[k];
				}
				vidaux = (char*)0xB8FA0-160;
				for(j=0;j<160;j++)
				{
					vidaux[j] = ' ';
					j++;
					vidaux[j] = WHITE_TXT; 
				}	
			
				offset = 0;
				parametros.longit = parametros.longit -(i+1);
				if(parametros.longit <= 0)
					parametros.longit = -2;
				i=-1;	
				posicion = (25*80*2)-160;
			}
			

		}
		posicion += 2 * (parametros.longit);
		if(parametros.longit < 0)
		{
			posicion = (25*80*2)-160;
		}
			
	}
	if(es_enter)
	{
		*(vidmem+posicion) = '$';
		*(vidmem+posicion+1) = WHITE_TXT;
		*(vidmem+posicion+2) = '-';
		*(vidmem+posicion+3) = WHITE_TXT;
		ult_pro = posicion+3;
		posicion = posicion+4;
	}
	*(vidmem+posicion) = '_';
	*(vidmem+posicion+1) = WHITE_TXT;
	return;
}
/**************************************************************************/
void
inicializa_video()
{
	unsigned int i=0;
	while(i < (80*25*2))
	{
		vidmem[i]=' ';
		i++;
		vidmem[i]=WHITE_TXT;
		i++;
	};
	vidmem[0]='$';
	vidmem[1]=WHITE_TXT;
	vidmem[2]='-';
	vidmem[3]=WHITE_TXT;
	posicion = 4;
	ult_pro = 3;
}
/**************************************************************************/
void
prnTab()	
{
	Tparametros parametros;
	int i;
	parametros.longit = 4;
	for(i=0;i<parametros.longit;i++)
		aux_buf[i]=' ';
	parametros.buffer = aux_buf;
	parametros.fd = 0;
	parametros.opcion = 0;
	_write(&parametros, 0);

	return;
}
/**************************************************************************/
void
prnEnter(void)
{
	Tparametros parametros;	
	int i;		
	aux_buf[0]='\n';
	parametros.longit = (160-(posicion%160))/2;
	for(i=1;i<parametros.longit+1;i++)
		aux_buf[i]=' ';
	parametros.buffer = aux_buf;
	parametros.fd = 0;
	parametros.opcion = 0;
	_write(&parametros, 0);

	return;	
}
/**************************************************************************/
void
prnChar(unsigned char ascii)
{
	Tparametros parametros;
	
	unsigned char var = ascii;

	parametros.buffer = &var;
	if(ascii == '\b')
		parametros.longit = -1;	
	else
		parametros.longit = 1;
	parametros.fd = 0;
	parametros.opcion = 0;

	_write(&parametros, 0);

	return ;
}
/**************************************************************************/
void
prnHexa(unsigned int numero)
{
	if ( (numero / 16) > 0 )
        	prnHexa(numero/16);

    	if ( (numero%16) < 10)
        	prnChar( (numero%16)+'0');
    	else
        	prnChar((numero%16)-10 + 'A');
	
	return;
}
/**************************************************************************/
void
prnBinary(unsigned int numero)
{
	if (numero == 0)
	{
		return;
	}

	prnBinary (numero/2);
	prnChar ((numero%2)+'0');
	return;
}
/**************************************************************************/
void
prnDecimal(int numero)
{

	if (numero == 0)
	{
		return;
	}

	prnDecimal (numero/10);
	prnChar ((numero%10)+'0');
	return;
}
/**************************************************************************/
void
prnString(unsigned char * cadena)
{
	int i=0;

	while (cadena[i]!='\0')
	{
		prnChar(cadena[i]);
		i++;
	}

	return;
}



